// package_todoList/pages/todoList/todoList.js


let recordArray = []

function getRandomID() {
    // 生成随机id的方法
    return Math.random().toString(16).substring(2, 8) + Date.now()

}

function getMonthDay(year, month) {
    let days = new Date(year, month, 0).getDate()
    return days
}

function getMemory() {
    return [{
        year: 2023,
        month: 7,
        date: 21,
        isGood: false,
        list: [{
                id: 'asdf111',
                title: '吃饭',
                completed: false,
            },
            {
                id: 'asdf112',
                title: '睡觉',
                completed: true,
                completedTime: 1689912816297
            }
        ]
    }]
}
Page({

    /**
     * 页面的初始数据
     */
    data: {
        year: 0, // 当前的年份
        month: 0, // 代表当前的月份
        day: 0, //当天日期
        dis: 0,
        activeMonth: 0, // 选中的月份默认是的当月
        activeYear: 0,
        activeDay: 0, // 选中日期
        memory: {}

    },
    countNextDay() {
        const planBar = this.selectComponent('.my-planbar');
        // 调用子组件的方法
        planBar.countNextDay()
    },
    handlechangeIsGood(e) {
        // console.log("改变喜爱状态", e)
        const tar = e.detail.value;
        this.setData({
            'memory.isGood': tar
        })

    },
    //任何改变日期的操作都需要先看一下本地存储中有没有当天的数据
    checkRecord() {
        // 通过当前活跃的日期找一下有没有当天的数据
        const targetIndex = recordArray.findIndex(item => {
            return (item.year === this.data.activeYear) && (item.month === this.data.activeMonth) && (item.day === this.data.activeDay)
        })
        // 如果找到了就设置找到的对象 如果没有找到就直接初始化数据
        if (targetIndex >= 0) {
            //找到了
            const tempList = [...recordArray[targetIndex].list]
            const tempObj = {
                ...recordArray[targetIndex],
                list: tempList
            }
            this.setData({
                memory: tempObj
            })
        } else {
            // 没找到
            // 初始化数据
            this.initData()
        }
    },
    handleEditItem(tar) {
        // console.log("根组件收到", tar)
        const {
            targetId,
            targetStatus
        } = tar.detail
        // 找到当天并且修改状态

        let tempArr = [...this.data.memory.list]
        tempArr = tempArr.map(item => {
            if (item.id === targetId) {
                return {
                    ...item,
                    completed: targetStatus,
                    completedTime: Date.now(),
                }
            } else {
                return {
                    ...item
                }
            }
        })
        const newObj = {
            ...this.data.memory,
            list: tempArr
        }
        this.setData({
            memory: newObj
        })
        // 调用子组件的方法
        this.updateChildData()

    },
    updateChildData() {
        // 跟新子组件数据
        const planBar = this.selectComponent('.my-planbar');
        // console.log(planBar,"子组件实例")
        planBar.changeCompletedArr()
    },
    handleAddTarget(e) {
        // 子组件传递过来的添加新的代办事项的事件
        // console.log(e, "新事件")
        const target = e.detail.value
        // 构建新增对象
        const tarObj = {
            id: getRandomID(),
            title: target,
            completed: false
        }
        // 将这条数据添加给当前页面的memory
        const tempArr = [...this.data.memory.list]
        tempArr.push(tarObj);
        const tempObj = {
            ...this.data.memory,
            list: tempArr
        }
        this.setData({
            memory: tempObj
        })
        this.updateChildData()


    },
    saveCurrentList() {
        // 判断当前的memory的list是否大于零 且isGood是否为false 如果不是就需要存储
        if (this.data.memory.list.length === 0 && !this.data.memory.isGood) {
            // 不用存储 
            // 没有有效信息
            return
        } else {
            // 有变动需要存储
            const targetIndex = recordArray.findIndex(item => {
                return (item.year === this.data.activeYear) && (item.month === this.data.activeMonth) && (item.day === this.data.activeDay)
            })
            if (targetIndex >= 0) {
                // 找到了当前的记录
                // 更改
                recordArray[targetIndex].list = [...this.data.memory.list]
                recordArray[targetIndex].isGood = this.data.memory.isGood
            } else {
                // 一条新纪录 直接push
                const tempArr = [...this.data.memory.list];
                const tempObj = {
                    ...this.data.memory,
                    list: tempArr
                };
                recordArray.push(tempObj)
            }
        }
    },

    handleToNext() {
        //触发滑动下一年的事件 如果是当年就不能滑动
        if (this.data.activeYear === this.data.year) {
            // console.log("触发不了")
            return
        }
        // 换日期就需要判断当前的数据有没有变动
        //到这里代表即将要换日期
        // 先保存原来的数据
        this.saveCurrentList();

        this.setData({
            activeYear: this.data.activeYear + 1,
            activeMonth: 1
        })
        this.countDis();
        // 加载新的数据
        this.checkRecord();
        //更新子组件数据
        this.updateChildData();
        this.countNextDay()
    },

    handleToLast() {
        // 触发滑动到上一年的事件 此时
        // 重新更新dis
        // dis的算法提成一个函数
        // 保存当前数据
        this.saveCurrentList();
        this.setData({
            activeYear: this.data.activeYear - 1,
            activeMonth: 12,

        })
        this.countDis();
        this.checkRecord();
        //更新子组件数据
        this.updateChildData();
        this.countNextDay()
    },
    countDis() {
        // 传入对应的m计算滚动到哪里
        const current = (this.data.activeMonth - 1) * 110 + 55;
        // 计算和375之间的差值
        let dis = current - 375;
        if (dis < 0) {
            // 代表没有移动的必要
            dis = 0
        }
        this.setData({
            dis: dis + 'rpx'
        })
    },
    handleChangeActive(e) {
        // console.log("父元素接收到的", e)
        const targetMonth = e.detail + 1;
        // 如果当前活跃的年月大于显示年月 则不能点击
        // console.log(targetMonth,"目标月份")
        if (targetMonth > this.data.month && this.data.activeYear === this.data.year) {
            // console.log("大于当前月份不能点击")
            return
        }
        // 判断是否回到当月
        if(targetMonth===this.data.month&&this.data.activeYear === this.data.year ){
            // 需要设置为当天
            this.setData({
                activeDay:this.data.day
            })
        }
        // 保存当前数据
        this.saveCurrentList()
        this.setData({
            activeMonth: targetMonth
        })
        //进行位移
        this.countDis()
        //加载下一个数据
        this.checkRecord()
        //更新子组件数据
        this.updateChildData();
        this.countNextDay()
    },
    initData() {
        // 更新当天的列表 五无添加 无更改 不存储
        // console.log("运行这里")
        this.setData({
            memory: {
                year: this.data.activeYear,
                month: this.data.activeMonth,
                day: this.data.activeDay,
                isGood: false,
                list: []
            }
        })
        // console.log(this.data.memory)
    },
    handlebackToLastDay() {
        this.saveCurrentList()
        if ((this.data.activeDay - 1) > 0) {
            // 大于1号
            // console.log("变动了")
            // 存数据
            this.setData({
                activeDay: this.data.activeDay - 1
            })
            // 初始数据更新


        } else {
            // return
            // 当等于零 需要返回上一个月
            // 找到上一个月的最大日期
            const targetYear = this.data.activeYear;
            const targetMonth = this.data.activeMonth;
            if (targetMonth - 1 > 0) {
                //当前不是1月
                const maxDay = getMonthDay(targetYear, targetMonth - 1);
                //    上一个月的
                // 回到上一个月
                this.setData({
                    activeDay: maxDay,
                    activeMonth: this.data.activeMonth - 1
                })
            }

        }
        // 拿数据
        this.checkRecord()
        //更新子组件数据
        this.updateChildData()
        this.countNextDay();
        this.countDis()
    },
    handleLoadNextDay(e) {
        // 加载下一天 判断active是不是当天
        // console.log('嘟嘟嘟')
        // console.log(this.data.activeDay);

        // 存数据
        // console.log(e,"下一天")
        const tar = e.detail.next;
        // 如果下一天是1
        // 且当前没有超过12月
        // 就切换下一个月
        this.saveCurrentList()
        if(tar===1){
            if(this.data.activeMonth-1<11){
                // 还在当年
                this.setData({
                    activeDay:1,
                    activeMonth:this.data.activeMonth+1
                })
            }
        }
        else{
            this.setData({
                activeDay: this.data.activeDay + 1
            })
        }
        
        //拿数据
        this.checkRecord()
        //更新子组件数据
        this.updateChildData();
        this.countDis()
    },
    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {

    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {
        // 一开始需要拿到当前的时间 让选中的月份到中间
        // 让当前的月份滑倒最中间 一个月份的宽度是110rpx
        // 屏幕的宽度为750rpx
        // 计算当前时间
        const date = new Date()
        const year = date.getFullYear();
        const month = date.getMonth() + 1;
        const day = date.getDate();
        // 一开始让活跃月份自动变成当月
        this.setData({
            year,
            month,
            day,
            activeMonth: month,
            activeYear: year,
            activeDay: day
        })
        // 计算初始滑动位置
        this.countDis()
        // const current = (month-1)*110+55;
        // // 计算和375之间的差值
        // let dis = current-375;
        // if(dis<0){
        //     // 代表没有移动的必要
        //     dis = 0
        // }
        // this.setData({
        //     dis:dis+'rpx'
        // })
        // 从本地存储中拿到所有的日期 然后将当天的记录照找出来 
        // 如果没有当天的记录就初始化新建一个
        // 先初始化以下当天的对象
        // if 本地对象中有当天 
        // else 本地对象中没有当天


        // 当前的todoList的数据存储到gloabldata中
        // 当页面hide 时才将数据同步到本地中 并且销毁globaldata中的数据
        wx.getStorage({
            key: 'todoList',
            complete: (res) => {
            //    if(!res.data){
            //        //这里代表没有数据

            //    }
                recordArray = res.data || [];
                // 从当前的recordArray中判断有没有当天的数据
                // console.log(res.data, "初始拿数据")
                this.checkRecord();
                //更新子组件数据
                this.updateChildData()
            }
        })
    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {
        // 页面隐藏将页面的数据存储到本地中
        this.saveCurrentList()
        // console.log("页面隐藏")
        // console.log(recordArray,'要存贮的数组')
        wx.setStorage({
            key: 'todoList',
            data: recordArray,

        })
    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {
        // wx.getStorage({
        //     key:'todoList',
        //     complete:(res)=>{
        //         console.log(res,拿到的数据)
        //     }
        // })
        // console.log(recordArray,"数据")
        this.saveCurrentList()
        // console.log(recordArray,'要存贮的数组')
        // console.log("页面unload")
        wx.setStorage({
            key: 'todoList',
            data: recordArray,
            // success:()=>{
            //     console.log("数据已经缓存")
            // }
        })
    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {
        // 这里更改activeDay


    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {
        // console.log("触底了")
    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage() {

    }
})